package net.huazai.config;

import lombok.Data;
import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Component;
import springfox.documentation.builders.*;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.schema.ScalarType;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 11987
 */
@Component
@Data
@EnableOpenApi
public class SwaggerConfig {

    /**
     * 初始化用户微服务 UserApiDoc 信息
     * @return Docket
     */
    @Bean
    public Docket userApiDoc(){
        return new Docket(DocumentationType.OAS_30)
                .groupName("用户微服务接口文档")
                .pathMapping("/")
                // 是否开启 swagger，false 为关闭，线上可以直接关闭
                .enable(true)
                // 配置 api 文档信息
                .apiInfo(apiInfo())
                // 选择哪些接口作为 swagger 的 doc 发布
                .select()
                .apis(RequestHandlerSelectors.basePackage("net.huazai"))
                // 正则匹配请求路径，并分配至当前组
                .paths(PathSelectors.ant("/api/**"))
                .build()
                // 新版 swagger 3.0 配置
                .globalRequestParameters(globalRequestParameters())
                .globalResponses(HttpMethod.GET, globalResponses())
                .globalResponses(HttpMethod.POST, globalResponses());

    }

    /**
     * 初始化后台 AdminApiDoc 信息
     * @return Docket
     */
    @Bean
    public Docket adminApiDoc(){
        return new Docket(DocumentationType.OAS_30)
                .groupName("后台接口文档")
                .pathMapping("/")
                // 是否开启 swagger，false 为关闭，线上可以直接关闭
                .enable(true)
                // 配置 api 文档信息
                .apiInfo(apiInfo())
                // 选择哪些接口作为 swagger 的 doc 发布
                .select()
                .apis(RequestHandlerSelectors.basePackage("net.huazai"))
                // 正则匹配请求路径，并分配至当前组
                .paths(PathSelectors.ant("/admin/**"))
                .build();
    }

    /**
     * 初始化 API 文档基础信息
     * @return ApiInfo
     */
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("华仔电商实战项目")
                .description("微服务接口文档")
                .contact(new Contact("华仔知识星球-huazai"
                        , "https://wx.zsxq.com/dweb2/index/group/51122554151214"
                        , "1030181803@qq.com"))
                .version("V1.0")
                .build();
    }

    /**
     * 生成全局请求头参数
     * @return  List
     */
    private List<RequestParameter> globalRequestParameters(){
        List<RequestParameter> parameterList = new ArrayList<>();
        // 如需更多 直接复制修改即可
        parameterList.add(new RequestParameterBuilder()
                .name("token")
                .description("登录令牌信息")
                .in(ParameterType.HEADER)
                .query(q -> q.model(
                                m -> m.scalarModel(
                                        ScalarType.STRING)))
                .required(false)
                .build());
        return parameterList;
    }

    private List<Response> globalResponses(){
        List<Response> respList = new ArrayList<>();
        respList.add(new ResponseBuilder().code("4xx")
                .description("请求错误，请认真检查").build());
        return respList;
    }

}